#ifndef DICTHANDLER_H
#define DICTHANDLER_H

#include "userdict.h"
#include "pinyinhandler.h"
#include "encryptutil.h"
#include "configmanager.h"
#include <QObject>
#include <QVector>
#include <QMap>
#include <QMutex>
#include <QSet>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

// 前置声明：避免循环依赖
struct PinyinCandidate;

class DictHandler : public QObject
{
    Q_OBJECT
    Q_DISABLE_COPY_MOVE(DictHandler)

public:
    // 单例接口（线程安全）
    static DictHandler* getInstance(QObject *parent = nullptr);
    ~DictHandler() override;

    // 核心接口：根据拼音查询合并后的候选词（系统词+用户词）
    QVector<PinyinCandidate> queryCandidates(const QString& pinyin);
    // 加载系统词典（支持加密/非加密JSON）
    bool loadSystemDict(const QString& jsonPath, bool encrypted = false);
    // 清空查询缓存（用户词变更/系统词重新加载时调用）
    void clearCache();
    // 获取词数统计
    int getSystemWordCount() const { return m_systemWordCount; }
    int getUserWordCount() const { return UserDict::getInstance()->getWordCount(); }

signals:
    void systemDictLoaded(bool success);  // 系统词典加载结果通知
    void dictUpdated();                 // 词典内容更新通知（用户词增删改）

private slots:
    // 监听用户词典变更，刷新缓存
    void onUserDictChanged();

private:
    // 私有构造：确保单例
    explicit DictHandler(QObject *parent = nullptr);
    // 合并系统词与用户词（用户词优先，按词频排序）
    QVector<PinyinCandidate> mergeCandidates(
        const QVector<PinyinCandidate>& systemCandidates,
        const QVector<PinyinCandidate>& userCandidates
    );
    // 内部接口：查询系统词典
    QVector<PinyinCandidate> querySystemDict(const QString& pinyin);
    // 内部接口：查询用户词典（委托给UserDict）
    QVector<PinyinCandidate> queryUserDict(const QString& pinyin);

private:
    static DictHandler* m_instance;
    static QMutex m_instanceMutex;  // 单例线程安全锁

    // 系统词典存储：拼音 → 候选词列表
    QMap<QString, QVector<PinyinCandidate>> m_systemDict;
    // 查询缓存：拼音 → 合并后的候选词（减少重复计算）
    QMap<QString, QVector<PinyinCandidate>> m_queryCache;
    int m_systemWordCount = 0;  // 系统词典总词数
    mutable QMutex m_dictMutex;  // 保护系统词典读写
    mutable QMutex m_cacheMutex; // 保护缓存读写

    // 依赖组件
    UserDict* m_userDict = nullptr;
};

#endif  // DICTHANDLER_H